// 该代码是一个使用inet_ntoa函数的实例，可以观察到如何将网络地址转换为对应的点分十进制IP地址
/*
 * 首先使用inet_addr函数将通过argv[1]和argv[2]参数传递的两个点分十进制IP地址转换为对应的网络地址
 * 由于inet_ntoa函数的参数必须是in_addr类型的结构体变量，所以使用memcpy函数将网络地址直接拷贝到两个in_addr类型的结构体变量netaddr1和netaddr2中，再传递给inet_ntoa函数进行处理，最后在屏幕上输出
 * */

#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>

int main(int argc, char *argv[]){
	
	int temp;
	// 创建两个变量，用来存储ip地址转换的网络地址
	unsigned long iptemp1,iptemp2;

	// 创建两个变量，用来存储网络地址!!不可以使用指针，如果使用指针则会报 ‘转存错误’!!!应该是因为需要使用const变量的原因
	struct in_addr testaddr1,testaddr2;

	// 判断是否输入两个点分十进制地址
	if(argc != 3){
		printf("请输入正确的点分十进制地址!\n");
		return 2;
	}

	// 将argv[1]和argv[2]中的两个IP地址转换为网络地址
	iptemp1 = inet_addr(argv[1]);
	iptemp2 = inet_addr(argv[2]);

	printf("%s的网络地址为：%lu\n", argv[1], iptemp1);
	printf("%s的网络地址为：%lu\n", argv[2], iptemp2);

	// 将网络地址存储到in_addr类型中
	memcpy(&testaddr1,&iptemp1,sizeof(iptemp1));
	memcpy(&testaddr2, &iptemp2, sizeof(iptemp2));
	
	// 可以看到该结果返回的两个ip地址相同，因为inet_ntoa函数的返回值直到下次调用前一直有效
	// 所以如果在线程中使用inet_ntoa函数的时候，一定要确保每次只有一个线程调用本函数，否则一个线程返回的结果可能被其他线程返回的结果所覆盖
	printf("testaddr1 = %s;   testaddr2 = %s\n", inet_ntoa(testaddr1), inet_ntoa(testaddr2));
	// 将网络地址转化为ip地址
	iptemp1 = inet_ntoa(testaddr1);
	iptemp2 = inet_ntoa(testaddr2);

	// 打印两个地址
	printf("testaddr1 = %s\n", inet_ntoa(testaddr1));
	printf("testaddr2 = %s\n", inet_ntoa(testaddr2));

	return 0;
}
